#ifndef NETCLIENT_H
#define NETCLIENT_H

#include "notify.qpb.h"
#include "../model/data.h"

#include <QObject>
#include <QNetworkAccessManager>
#include <QWebSocket>
#include <QProtobufSerializer>

// 此处为了避免 "循环包含" 问题, 就需要使用 前置声明 代替包含头文件
namespace model {
class DataCenter;

}  // end model

namespace network
{

class NetClient : public QObject
{
    Q_OBJECT
private:
    // 定义重要常量. ip 都暂时使用本地的环回 ip. 端口号约定成 8000 和 8001
    const QString HTTP_URL = "http://127.0.0.1:8000";
    const QString WEBSOCKET_URL = "ws://127.0.0.1:8001/ws";

    // 数据中心实例指针
    model::DataCenter* dataCenter;

    // http 客户端
    QNetworkAccessManager httpClient;

    // websocket 客户端
    QWebSocket websocketClient;

    // 序列化器
    QProtobufSerializer serializer;

public:
    NetClient(model::DataCenter* dataCenter);

    /////////////////////////////////////////////////////////////////////////////////
    /// 下列逻辑都是 Http 相关的操作
    /////////////////////////////////////////////////////////////////////////////////
    void ping();

    /////////////////////////////////////////////////////////////////////////////////
    /// 下列逻辑都是 Websocket 相关的操作
    /////////////////////////////////////////////////////////////////////////////////
    // 初始化 websocket
    void initWebsocket();

    // 针对 websocket 的处理
    void handleWsResponse(const bite_im::NotifyMessage& notifyMessage);
    void handleWsMessage(const model::Message& message);
    void handleWsRemoveFriend(const QString& userId);
    void handleWsAddFriendApply(const model::UserInfo& userInfo);
    void handleWsAddFriendProcess(const model::UserInfo& userInfo, bool agree);
    void handleWsSessionCreate(const model::ChatSessionInfo& chatSessionInfo);

    // 发送身份认证请求
    void sendAuth();

signals:
}; // end class

} // end namespace

#endif // NETCLIENT_H
